package com.tt.job.register;

/**
 * 注册中心
 */
public interface RegistryCenter {

    /**
     * 添加对于leader角色的监听
     *
     * @param listener
     */
    void addLeaderListener(LeaderChangeListener listener);

    /**
     * 关闭注册中心.
     */
    void close();

    /**
     * 写入临时数据（非时序的）.
     *
     * @param key   键
     * @param value 值
     */
    boolean ephemeral(String key, String value) throws Exception;

    /**
     * 获取注册数据.
     *
     * @param key 键
     * @return 值
     */
    String get(String key) throws Exception;

    /**
     * 直接获取操作注册中心的原生客户端.
     * 如：Zookeeper或Redis等原生客户端.
     *
     * @return 注册中心的原生客户端
     */
    Object getRawClient();

    /**
     * 获取数据是否存在.
     *
     * @param key 键
     * @return 数据是否存在
     */
    boolean isExisted(String key) throws Exception;

    /**
     * 尝试成为leader
     */
    boolean leading();

    /**
     * 持久化注册数据.
     *
     * @param key   键
     * @param value 值
     */
    void persist(String key, String value) throws Exception;

    /**
     * 删除注册数据.
     *
     * @param key 键
     */
    void remove(String key) throws Exception;

    /**
     * 启动注册中心. 此方法会阻塞线程执行，直到启动完成.
     */
    void start() throws Exception;

    /**
     * 更新注册数据.
     *
     * @param key   键
     * @param value 值
     */
    void update(String key, String value) throws Exception;
}
